package les

import grails.converters.*
import com.solution51.sfu.*;

class EquipeController {

	static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
	
	def index = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		redirect(action: "list", params: params)
	}

	def list = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		
		params.max = Math.min(params.max ? params.int('max') : 10, 100)
		[equipeInstanceList: Equipe.list(params), equipeInstanceTotal: Equipe.count()]
	}

	def create = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		
		def equipeInstance = new Equipe()
		equipeInstance.properties = params
		return [equipeInstance: equipeInstance]
	}

	def save = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		
		def equipeInstance = new Equipe(params)
		if (equipeInstance.save(flush: true)) {
			flash.message = "${message(code: 'default.created.message', args: [message(code: 'equipe.label', default: 'Equipe'), equipeInstance.id])}"
			redirect(action: "show", id: equipeInstance.id)
		}
		else {
			render(view: "create", model: [equipeInstance: equipeInstance])
		}
	}

	def show = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		def equipeInstance = Equipe.get(params.id)
		if (!equipeInstance) {
			flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'equipe.label', default: 'Equipe'), params.id])}"
			redirect(action: "list")
		}
		else {
			[equipeInstance: equipeInstance]
		}
	}

	def edit = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		
		def equipeInstance = Equipe.get(params.id)
		if (!equipeInstance) {
			flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'equipe.label', default: 'Equipe'), params.id])}"
			redirect(action: "list")
		}
		else {
			return [equipeInstance: equipeInstance]
		}
	}

	def update = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		
		def equipeInstance = Equipe.get(params.id)
		if (equipeInstance) {
			if (params.nome) {
				equipeInstance.nome = params.nome;
			}
			if (params.corDoCracha) {
				equipeInstance.corDoCracha = params.corDoCracha;
			}
			if (params.encontro) {
				equipeInstance.encontro = Encontro.findById(params.encontro.id);
			}
			for (String idsARemover : params.list('removerCoordenador')) {
				String[] ids = idsARemover.split(" ")
				for (String idARemover : ids) {
					for (Integrante integr : equipeInstance.coordenadores) {
						if (integr.id + "" == idARemover) {
							equipeInstance.coordenadores.remove(integr)
							break;
						}
					}
				}
			}
			for (String idsARemover : params.list('removerMembro')) {
				String[] ids = idsARemover.split(" ")
				for (String idARemover : ids) {
					for (Integrante integr : equipeInstance.membros) {
						if (integr.id + "" == idARemover) {
							equipeInstance.membros.remove(integr)
							break;
						}
					}
				}
			}
			for (String nomeAAdicionar : params.list('adicionarCoordenador')) {
				if (nomeAAdicionar != "") {
					ArrayList<Integrante> integrantesAAdicionar = new ArrayList<Integrante>();
					if (nomeAAdicionar.startsWith("Casal:")) {
						String nome1 = nomeAAdicionar.substring(7).split(" / ")[0];
						integrantesAAdicionar.add(Integrante.findByNome(nome1));
						String nome2 = nomeAAdicionar.split(" / ")[1];
						integrantesAAdicionar.add(Integrante.findByNome(nome2));
					}
					else {
						integrantesAAdicionar.add(Integrante.findByNome(nomeAAdicionar));
					}
					for (Integrante integranteAAdicionar : integrantesAAdicionar) {
						if (!equipeInstance.coordenadores.contains(integranteAAdicionar)) {
							equipeInstance.coordenadores.add(integranteAAdicionar);
						}
					}
				}
			}
			for (String nomeAAdicionar : params.list('adicionarMembro')) {
				if (nomeAAdicionar != "") {
					ArrayList<Integrante> integrantesAAdicionar = new ArrayList<Integrante>();
					if (nomeAAdicionar.startsWith("Casal:")) {
						String nome1 = nomeAAdicionar.substring(7).split(" / ")[0];
						integrantesAAdicionar.add(Integrante.findByNome(nome1));
						String nome2 = nomeAAdicionar.split(" / ")[1];
						integrantesAAdicionar.add(Integrante.findByNome(nome2));
					}
					else {
						integrantesAAdicionar.add(Integrante.findByNome(nomeAAdicionar));
					}
					for (Integrante integranteAAdicionar : integrantesAAdicionar) {
						if (!equipeInstance.membros.contains(integranteAAdicionar)) {
							equipeInstance.membros.add(integranteAAdicionar);
						}
					}
				}
			}
			def webRootDir = servletContext.getRealPath("/")
			def uploadedFile = request.getFile('relatorio')
			if (uploadedFile && !uploadedFile.empty){
				def userDir = new File(webRootDir, "/relatorios")
				userDir.mkdirs()
				uploadedFile.transferTo( new File( userDir, uploadedFile.originalFilename))
				
				equipeInstance.arquivoRelatorio = uploadedFile.originalFilename;
			}
			if (params.removerRelatorio) {
				def arquivo = new File(webRootDir, "/relatorios/" + equipeInstance.arquivoRelatorio);
				arquivo.delete();
				equipeInstance.arquivoRelatorio = null;
			}
			if (!equipeInstance.hasErrors() && equipeInstance.save(flush: true)) {
				flash.message = "${message(code: 'default.updated.message', args: [message(code: 'equipe.label', default: 'Equipe'), equipeInstance.id])}"
				redirect(action: "show", id: equipeInstance.id)
			}
			else {
				render(view: "edit", model: [equipeInstance: equipeInstance])
			}
		}
		else {
			flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'equipe.label', default: 'Equipe'), params.id])}"
			redirect(action: "list")
		}
	}

	def delete = {
		if (!session.usuarioLogado) {
			redirect(uri: '/usuario/login.gsp')
			return
		}
		
		def equipeInstance = Equipe.get(params.id)
		if (equipeInstance) {
			try {
				def arquivoRelatorio = equipeInstance.arquivoRelatorio;
				equipeInstance.delete(flush: true)
				if (arquivoRelatorio) {
					def webRootDir = servletContext.getRealPath("/")
					def arquivo = new File(webRootDir, "/relatorios/" + arquivoRelatorio);
					arquivo.delete();
				}
				flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'equipe.label', default: 'Equipe'), params.id])}"
				redirect(action: "list")
			}
			catch (org.springframework.dao.DataIntegrityViolationException e) {
				flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'equipe.label', default: 'Equipe'), params.id])}"
				redirect(action: "show", id: params.id)
			}
		}
		else {
			flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'equipe.label', default: 'Equipe'), params.id])}"
			redirect(action: "list")
		}
	}
	
	def pegarIntegrantesParaAdicionar = {
		Equipe equipeInstance = Equipe.get(params.id)
		
		List integrantes = Integrante.findAllByNomeIlike("%${params.query}%")

		ArrayList<Integrante> integrantesParaResposta = new ArrayList<Integrante>();
		for (Integrante integrante : integrantes) {
			if (!equipeInstance.membros?.contains(integrante) && !equipeInstance.coordenadores?.contains(integrante) && !integrante.participaDoEncontro(equipeInstance.encontro)) {
				integrantesParaResposta.add(integrante)
			}
		}
		
		// Criar resposta XML
		render(contentType: "text/xml") {
			results() {
				for (i in integrantesParaResposta) {
					String nome = "";
					if (i.conjuge) {
						nome = "Casal: " + i.nome + " / " + i.conjuge.nome;
					} 
					else {
						nome = i.nome;
					}
					result(name: nome, id: i.id)
				}
			}
		}
	}
	
	def ajaxEquipesPorEncontro = {
		List equipes = Equipe.findAllByEncontro(Encontro.get(params.idencontro), [sort: "nome"]) 
		render equipes as JSON
	}
	
}
